/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.ik.RestauranteBar.SMO.Manejadores;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.Query;
import org.ik.RestauranteBar.SMO.Encapsulados.Productos;
import org.ik.RestauranteBar.SMO.Encapsulados.Tablas.Productos_Tabla;
import org.ik.RestauranteBar.SMO.Encapsulados.Tipoproducto;
import org.ik.RestauranteBar.SMO.Manejadores.Conectores.ConexionMySQL;

/**
 *
 * @author Malkavian
 */
public class ManejadorProductos extends ConexionMySQL {

    private static ManejadorProductos manager;

    public static ManejadorProductos getInstance() {
        if (manager == null) {
            manager = new ManejadorProductos();
        }
        return manager;
    }

    private ManejadorProductos() {
    }

    public List<Productos> getProductos() {
        List<Productos> clientes = null;

        try {
            Query query = getEntity().createNamedQuery("Productos.findAll");
            clientes = query.getResultList();
        } catch (Exception ex) {
        }

        return clientes;
    }
    
    public List<Productos_Tabla> getProductosTabla() {
        List<Productos_Tabla> clientes = new ArrayList();
        List<Productos> productos = null;

        try {
//            Query query = getEntity().createNativeQuery("Select p.idproducto,p.nombre,p.precio,t.descripcion from Productos p, TipoProducto t where p.tipoproducto_id = t.id");
            Query query = getEntity().createNamedQuery("Productos.findAll");
            productos = query.getResultList();
            
            for(Productos p: productos){
            
                Productos_Tabla cli = new Productos_Tabla();
                
                cli.setId(p.getIdproducto());
                cli.setNombre(p.getNombre());
                cli.setPrecio(p.getPrecio());
                cli.setTipo(p.getTipoProductoid().getDescripcion());
                
                clientes.add(cli);
            
            }
            
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }

        return clientes;
    }
    
        public List<Productos_Tabla> getProductosTabla(String descri) {
       List<Productos_Tabla> clientes = new ArrayList();
        List<Productos> productos = null;

        try {
//            Query query = getEntity().createNativeQuery("Select p.idproducto,p.nombre,p.precio,t.descripcion from Productos p, TipoProducto t where p.tipoproducto_id = t.id");
            Query query = getEntity().createNamedQuery("Productos.findByNombre");
            query.setParameter("nombre", descri);
            productos = query.getResultList();
            
            for(Productos p: productos){
            
                Productos_Tabla cli = new Productos_Tabla();
                
                cli.setId(p.getIdproducto());
                cli.setNombre(p.getNombre());
                cli.setPrecio(p.getPrecio());
                cli.setTipo(p.getTipoProductoid().getDescripcion());
                
                clientes.add(cli);
            
            }
        } catch (Exception ex) {
        }

        return clientes;
    }

    public Productos getProducto(int idproducto) {
        Productos cliente = null;

        try {
            Query query = getEntity().createNamedQuery("Productos.findByIdproducto");
            query.setParameter("idproducto", idproducto);
            cliente = (Productos) query.getSingleResult();
        } catch (Exception ex) {
        }

        return cliente;
    }

    public List<Productos> getProductoPorTipo(int idtipo) {
        List<Productos> cliente = null;

        try {
            Query query = getEntity().createQuery("SELECT p FROM Productos p WHERE p.tipoProductoid.id = :id");
            query.setParameter("id", idtipo);
            cliente = query.getResultList();
        } catch (Exception ex) {
        }

        return cliente;
    }
    
    public List<Tipoproducto> getTiposUtilizados() {
        List<Tipoproducto> cliente = null;

        try {
            Query query = getEntity().createQuery("SELECT p.tipoProductoid FROM Productos p GROUP BY p.tipoProductoid");
            cliente = query.getResultList();
        } catch (Exception ex) {
        }

        return cliente;
    }
    
    public int maxProductos() {

        try {

            Query query = getEntity().createQuery("select MAX(p.idproducto) FROM Productos p", int.class);
            int deleted = (int) query.getSingleResult();
            return deleted;
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            return 0;
        }

    }

    public Boolean borrarProductos(int usuario) {

        try {
            getEntity().getTransaction().begin();
            Query query = getEntity().createNativeQuery("DELETE FROM productos u WHERE u.idproducto = ?");
            query.setParameter(1, usuario);
            int deleted = query.executeUpdate();
            getEntity().getTransaction().commit();
            return true;
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            return false;
        }

    }

    public Boolean insertarProductos(Productos cliente) {

        try {

            getEntity().getTransaction().begin();
            getEntity().persist(cliente);
            getEntity().getTransaction().commit();
            return true;

        } catch (Exception ex) {
            return actualizarProductos(cliente);
        }

    }

    public Boolean actualizarProductos(Productos cliente) {

        try {

            getEntity().getTransaction().begin();
            getEntity().merge(cliente);
            getEntity().getTransaction().commit();
            return true;

        } catch (Exception ex) {

            return false;
        }

    }
}
